from wsgiref.simple_server import make_server


# 要实现多url：
# 1.路由分发器，负责把url匹配到对应的函数
# 2.开发对应业务函数
# 3.新的请求先经过路由分发器，如果找到对应function就执行，否则就返回404
def book(environment, start_response):
    print("book page")

    resp_body = [bytes("<h1 style=color:red>book page。。。</h1>", encoding='utf-8'), ]  # 列表格式：设置响应体内容
    return resp_body  # 返回响应体


def cloth(environment, start_response):
    print("cloth page")

    resp_body = [bytes("<h1 style=color:blue>cloth page。。。</h1>", encoding='utf-8'), ]  # 列表格式：设置响应体内容
    return resp_body  # 返回响应体


# 路由分发器
def url_distributor():
    urls = {
        '/book': book,
        '/cloth': cloth,
    }

    return urls  # 返回路由字典


# run_server必须实现两个参数,否则会报错"TypeError: run_server() takes 0 positional arguments but 2 were given"
# 因为默认make_server封装了两个参数传递过来，第一个是浏览器请求头(环境)，第二个是一个方法，用于向客户端返回内容
def run_server(environment, start_response):
    print(environment)

    url_list = url_distributor()  # 拿到url字典
    requests_url = environment.get("PATH_INFO")  # 环境字典的'PATH_INFO'键对应的值是url
    print('request url', requests_url)

    # 处理对应url
    if requests_url in url_list:
        # 流程和本质上的socket一致
        start_response("200 OK", [('Content-Type', 'text/html;charset=utf-8')])  # 固定格式:设置响应头
        resp_body = url_list[requests_url](environment, start_response)  # 调用对应处理方法获取响应体内容
    else:
        # 未找到页面
        start_response("404 ", [('Content-Type', 'text/html;charset=utf-8')])  # 固定格式:设置响应头
        resp_body = [bytes("<h1 style=font-size:50px>404, page not found!</h1>", encoding='utf-8'), ]  # 列表格式：设置响应体内容

    return resp_body  # 返回响应体


s = make_server('localhost', 8000, run_server)  # 接收请求，让请求经过run_server
s.serve_forever()  # 启动服务，相当于死循环，一直监听指定端口
